home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Practical Algorithms for Image Analysis
/
Practical Algorithms for Image Analysis.iso
/
CH_6.1
/
XVOR
/
EDGELIST.C
next >
Wrap
C/C++ Source or Header
|
1999-09-11
|
4KB
|
190 lines
/*
* edgelist.c
*
* Practical Algorithms for Image Analysis
*
* Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
*/
/*
* EDGELIST
*
*/
#include <stdlib.h>
#include "vor.h"
int ntry, totalsearch;
void
ELinitialize ()
{
int i;
freeinit (&hfl, sizeof **ELhash);
ELhashsize = 2 * sqrt_nsites;
ELhash = (struct Halfedge **) myalloc (sizeof *ELhash * ELhashsize);
for (i = 0; i < ELhashsize; i += 1)
ELhash[i] = (struct Halfedge *) NULL;
ELleftend = HEcreate ((struct Edge *) NULL, 0);
ELrightend = HEcreate ((struct Edge *) NULL, 0);
ELleftend->ELleft = (struct Halfedge *) NULL;
ELleftend->ELright = ELrightend;
ELrightend->ELleft = ELleftend;
ELrightend->ELright = (struct Halfedge *) NULL;
ELhash[0] = ELleftend;
ELhash[ELhashsize - 1] = ELrightend;
}
struct Halfedge *
HEcreate (e, pm)
struct Edge *e;
int pm;
{
struct Halfedge *answer;
answer = (struct Halfedge *) getfree (&hfl);
answer->ELedge = e;
answer->ELpm = (char) pm;
answer->PQnext = (struct Halfedge *) NULL;
answer->vertex = (struct Site *) NULL;
answer->ELrefcnt = 0;
return (answer);
}
void
ELinsert (lb, new)
struct Halfedge *lb, *new;
{
new->ELleft = lb;
new->ELright = lb->ELright;
(lb->ELright)->ELleft = new;
lb->ELright = new;
}
/* Get entry from hash table, pruning any deleted nodes */
struct Halfedge *
ELgethash (b)
int b;
{
struct Halfedge *he;
if (b < 0 || b >= ELhashsize)
return ((struct Halfedge *) NULL);
he = ELhash[b];
if ((he == (struct Halfedge *) NULL) ||
(he->ELedge != (struct Edge *) DELETED))
return (he);
/* Hash table points to deleted half edge. Patch as necessary. */
ELhash[b] = (struct Halfedge *) NULL;
if ((he->ELrefcnt -= 1) == 0)
makefree ((struct Freenode *) he, &hfl);
return ((struct Halfedge *) NULL);
}
struct Halfedge *
ELleftbnd (p)
struct Point *p;
{
int i, bucket;
struct Halfedge *he;
/* Use hash table to get close to desired halfedge */
bucket = (int) (((p->x - xmin) / deltax) * ELhashsize);
if (bucket < 0)
bucket = 0;
if (bucket >= ELhashsize)
bucket = ELhashsize - 1;
he = ELgethash (bucket);
if (he == (struct Halfedge *) NULL) {
for (i = 1; 1; i += 1) {
if ((he = ELgethash (bucket - i)) != (struct Halfedge *) NULL)
break;
if ((he = ELgethash (bucket + i)) != (struct Halfedge *) NULL)
break;
}
totalsearch += i;
}
ntry += 1;
/* Now search linear list of halfedges for the corect one */
if (he == ELleftend || (he != ELrightend && right_of (he, p))) {
do {
he = he->ELright;
} while (he != ELrightend && right_of (he, p));
he = he->ELleft;
}
else
do {
he = he->ELleft;
} while (he != ELleftend && !right_of (he, p));
/* Update hash table and reference counts */
if (bucket > 0 && bucket < ELhashsize - 1) {
if (ELhash[bucket] != (struct Halfedge *) NULL)
ELhash[bucket]->ELrefcnt -= 1;
ELhash[bucket] = he;
ELhash[bucket]->ELrefcnt += 1;
}
return (he);
}
/*
* This delete routine can't reclaim node, since pointers from hash
* table may be present.
*/
void
ELdelete (he)
struct Halfedge *he;
{
(he->ELleft)->ELright = he->ELright;
(he->ELright)->ELleft = he->ELleft;
he->ELedge = (struct Edge *) DELETED;
}
struct Halfedge *
ELright (he)
struct Halfedge *he;
{
return (he->ELright);
}
struct Halfedge *
ELleft (he)
struct Halfedge *he;
{
return (he->ELleft);
}
struct Site *
leftreg (he)
struct Halfedge *he;
{
if (he->ELedge == (struct Edge *) NULL)
return (bottomsite);
return (he->ELpm == le ? he->ELedge->reg[le] : he->ELedge->reg[re]);
}
struct Site *
rightreg (he)
struct Halfedge *he;
{
if (he->ELedge == (struct Edge *) NULL)
return (bottomsite);
return (he->ELpm == le ? he->ELedge->reg[re] : he->ELedge->reg[le]);
}